#!/usr/bin/env python
# encoding: utf-8
"""
@Author: Beam
@Mail:506556658@qq.com
@file: 进程池.py
@time: 2017/5/9 9:12
"""

from  multiprocessing import Process, Pool
import time,os

def Foo(i):
    time.sleep(2)
    print("In process ",os.getpid())
    return i + 100

def Bar(arg):
    print('-->exec done:', arg,os.getpid())  #该函数是通过进程池的callback回调函数执行，观察这个pid，发现跟父进程的PID是一致的

if __name__ == '__main__':
    print("父进程PID:",os.getpid())
    #注意，在windows跑进程池必须有if __name__ == '__main__'
    pool = Pool(5)   #限制5个进程放入进程池参数5其实等同于process=5
    for i in range(10):
        pool.apply_async(func=Foo, args=(i,), callback=Bar)  #callback回调函数，即执行完func的方法之后执行callback对应的方法,意义在于不需要每个子进程都创建一个连接
        #pool.apply(func=Foo, args=(i,))   #串行
        #pool.apply_async(func=Foo, args=(i,),)  #异步，并行
    print('end')
    pool.close()  #进程池必须要先关闭后join，不同于线程和进程先join后close
    pool.join()  # 进程池中进程执行完毕后再关闭，如果注释，那么程序直接关闭。